﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Xml;
using Framework.CapaDeDatos.Excepciones;
using Framework.CapaDeDatos.Proveedores.Persistencia.Serializados;

namespace Framework.CapaDeDatos.Proveedores.Persistencia
{
    public class GraphApi : IPersistencia
    {
        #region Private Fields
        private ISerializado serializado;
        private String accessToken;
        private Uri baseURL = new Uri("https://graph.facebook.com");
        private Type claseObjeto = typeof(Framework.Modelo.Facebook.Objeto);
        #endregion

        #region Public Constructors

        public GraphApi(ISerializado serializado)
        {
            if (serializado != null)
                this.serializado = serializado;
            else
                throw new ExceptionParametroNulo();
        }

        public GraphApi(ISerializado serializado, String accessToken)
        {
            if (serializado == null)
                throw new ExceptionParametroNulo();
            this.serializado = serializado;
            this.accessToken = accessToken;
        }

        #endregion

        #region IPersistencia Members

        public XmlDocument Recuperar(Guid guid)
        {
            String query = null;
            XmlDocument resultado = null;
            Dictionary<String, String> args = new Dictionary<String, String>();
            if (!String.IsNullOrEmpty(accessToken))
                args["access_token"] = accessToken;

            Int32 id = 0;
            Boolean isId = Int32.TryParse(guid.ToString().Replace("-",""), out id);
            String parameters = String.Empty;
            if (args != null && args.Keys.Count > 0)
                parameters = EncodeDictionary(args, true);

            query = new Uri(baseURL, String.Format("/{0}{1}", id, parameters)).ToString();
            resultado = this.serializado.Recuperar(query, claseObjeto.FullName);
            return resultado;
        }

        public XmlDocument Guardar(System.Xml.XmlDocument xmlDocument)
        {
            String query = null;
            String postData = null;
            Dictionary<String, String> args = Obtener(xmlDocument);
            //TODO: Armar la consulta
            return this.serializado.Guardar(query, postData, claseObjeto.FullName);
        }

        #endregion

        private Dictionary<String, String> Obtener(XmlDocument xmlDocument)
        {
            Dictionary<String, String> resultado = null; 
            if (xmlDocument != null && xmlDocument.HasChildNodes)
            {
                resultado = new Dictionary<String, String>();
                foreach (XmlNode xn in xmlDocument.ChildNodes)
                {
                    resultado.Add(xn.Name, xn.Value.ToString());
                }
            }
            return resultado;
        }

        private string EncodeDictionary(Dictionary<string, string> dict, bool questionMark)
        {
            StringBuilder sb = new StringBuilder();
            if (questionMark)
            {
                sb.Append("?");
            }
            foreach (KeyValuePair<string, string> kvp in dict)
            {
                sb.Append(HttpUtility.UrlEncode(kvp.Key));
                sb.Append("=");
                sb.Append(HttpUtility.UrlEncode(kvp.Value));
                sb.Append("&");
            }
            sb.Remove(sb.Length - 1, 1);
            return sb.ToString();
        }
    }
}
